home *** CD-ROM | disk | FTP | other *** search
/ Euroscene 2 / Euroscene 2.iso / USEFUL / DeliTracker130 / Developer / Developer.run / Examples / FC1.3.s < prev    next >
Encoding:
Text File  |  1992-09-23  |  20.7 KB  |  917 lines

  1.  
  2.     incdir    "Includes:"
  3.     include    "misc/DeliPlayer.i"
  4.  
  5. ;
  6. ;
  7.     SECTION Player,Code
  8. ;
  9. ;
  10.  
  11.     PLAYERHEADER PlayerTagArray
  12.  
  13.     dc.b '$VER: Future Composer 1.0-1.3 player module V2.1 (04 Sep 92)',0
  14.     even
  15.  
  16. PlayerTagArray
  17.     dc.l    DTP_PlayerVersion,4
  18.     dc.l    DTP_PlayerName,PName
  19.     dc.l    DTP_Creator,CName
  20.     dc.l    DTP_Check2,Chk
  21.     dc.l    DTP_Interrupt,Int
  22.     dc.l    DTP_InitPlayer,InitPlay
  23.     dc.l    DTP_EndPlayer,EndPlay
  24.     dc.l    DTP_InitSound,InitSnd
  25.     dc.l    DTP_EndSound,RemSnd
  26.     dc.l    DTP_Volume,SetVol
  27.     dc.l    DTP_Balance,SetVol
  28.     dc.l    TAG_DONE
  29.  
  30. *-----------------------------------------------------------------------*
  31. ;
  32. ; Player/Creatorname und lokale Daten
  33.  
  34. PName    dc.b 'FutureComposer_1.3',0
  35. CName    dc.b 'SuperSero of the Superions,',10
  36.     dc.b 'adapted by Delirium',0
  37.     even
  38. MODULE        dc.l 0
  39. fc_songend    dc.l 0
  40.  
  41. fc_SndLVol    dc.w 0
  42. fc_SndRVol    dc.w 0
  43.  
  44. *-----------------------------------------------------------------------*
  45. ;
  46. ;Interrupt für Replay
  47.  
  48. Int
  49.     movem.l    d0-d7/a0-a6,-(sp)
  50.     jsr    PLAY                ; DudelDiDum
  51.     movem.l    (sp)+,d0-d7/a0-a6
  52.     rts
  53.  
  54. *-----------------------------------------------------------------------*
  55. ;
  56. ; Testet auf Modul
  57.  
  58. Chk                        ; FC 1.3 ?
  59.     move.l    dtg_ChkData(a5),a0
  60.     move.l    (a0),d0
  61.     subi.l    #"SMOD",d0
  62.     rts
  63.  
  64. *-----------------------------------------------------------------------*
  65. ;
  66. ; Init Player
  67.  
  68. InitPlay
  69.     moveq    #0,d0
  70.     move.l    dtg_GetListData(a5),a0        ; Function
  71.     jsr    (a0)
  72.     move.l    a0,MODULE
  73.  
  74.     move.l    dtg_SongEnd(a5),fc_songend    ; store Songend FunctionPtr
  75.  
  76.     move.l    dtg_AudioAlloc(a5),a0        ; Function
  77.     jsr    (a0)                ; returncode is already set !
  78.     rts
  79.  
  80. *-----------------------------------------------------------------------*
  81. ;
  82. ; End Player
  83.  
  84. EndPlay
  85.     move.l    dtg_AudioFree(a5),a0        ; Function
  86.     jsr    (a0)
  87.     rts
  88.  
  89. *-----------------------------------------------------------------------*
  90. ;
  91. ; Init Sound
  92.  
  93. InitSnd
  94.     jsr    INIT_MUSIC            ; Init Sound
  95.     rts
  96.  
  97. *-----------------------------------------------------------------------*
  98. ;
  99. ; Remove Sound
  100.  
  101. RemSnd
  102.     jsr     END_MUSIC            ; End Sound
  103.     rts
  104.  
  105. *-----------------------------------------------------------------------*
  106. ;
  107. ; Copy Volume and Balance Data to internal buffer
  108.  
  109. SetVol
  110.     move.w    dtg_SndLBal(a5),d0
  111.     mulu    dtg_SndVol(a5),d0
  112.     lsr.w    #6,d0
  113.     move.w    d0,fc_SndLVol            ; Left Volume
  114.  
  115.     move.w    dtg_SndRBal(a5),d0
  116.     mulu    dtg_SndVol(a5),d0
  117.     lsr.w    #6,d0
  118.     move.w    d0,fc_SndRVol            ; Right Volume
  119.     rts
  120.  
  121. *-----------------------------------------------------------------------*
  122. ;
  123. ; FUTURE COMPOSER-Replay 1.0-1.3
  124.  
  125. ;
  126. ;
  127.     SECTION    Replay,Code_C
  128. ;
  129. ;
  130.  
  131. ***************************************************************
  132. **  Amiga FUTURE COMPOSER V1.0 / 1.2 / 1.3   Replay routine  **
  133. ***************************************************************
  134.  
  135.  
  136. END_MUSIC:
  137.     clr.w onoff
  138.     clr.l $dff0a6
  139.     clr.l $dff0b6
  140.     clr.l $dff0c6
  141.     clr.l $dff0d6
  142.     move.w #$000f,$dff096
  143. ;    bclr #1,$bfe001
  144.     rts
  145.  
  146. INIT_MUSIC:
  147.     move.w #1,onoff
  148. ;    bset #1,$bfe001
  149.     move.l MODULE,a0
  150.     lea 100(a0),a1
  151.     move.l a1,SEQpoint
  152.     move.l a0,a1
  153.     add.l 8(a0),a1
  154.     move.l a1,PATpoint
  155.     move.l a0,a1
  156.     add.l 16(a0),a1
  157.     move.l a1,FRQpoint
  158.     move.l a0,a1
  159.     add.l 24(a0),a1
  160.     move.l a1,VOLpoint
  161.     move.l 4(a0),d0
  162.     divu #13,d0
  163.  
  164.     lea 40(a0),a1
  165.     lea SOUNDINFO+4(pc),a2
  166.     moveq #10-1,d1
  167. initloop:
  168.     move.w (a1)+,(a2)+
  169.     move.l (a1)+,(a2)+
  170.     addq.w #4,a2
  171.     dbf d1,initloop
  172.     moveq #0,d2
  173.     move.l a0,d1
  174.     add.l 32(a0),d1
  175.     sub.l #WAVEFORMS,d1
  176.     lea SOUNDINFO(pc),a0
  177.     move.l d1,(a0)+
  178.     moveq #9-1,d3
  179. initloop1:
  180.     move.w (a0),d2
  181.     add.l d2,d1
  182.     add.l d2,d1
  183.     addq.w #6,a0
  184.     move.l d1,(a0)+
  185.     dbf d3,initloop1
  186.  
  187.     move.l SEQpoint(pc),a0
  188.     moveq #0,d2
  189.     move.b 12(a0),d2        ;Get replay speed
  190.     bne.s speedok
  191.     move.b #3,d2            ;Set default speed
  192. speedok:
  193.     move.w d2,respcnt        ;Init repspeed counter
  194.     move.w d2,repspd
  195. INIT2:
  196.     clr.w audtemp
  197.     clr.w spdtemp
  198.     move.w #$000f,$dff096        ;Disable audio DMA
  199.     move.w #$0780,$dff09a        ;Disable audio IRQ
  200.     moveq #0,d7
  201.     mulu #13,d0
  202.     moveq #4-1,d6            ;Number of soundchannels-1
  203.     lea V1data(pc),a0        ;Point to 1st voice data area
  204.     lea SILENT(pc),a1
  205.     lea o4a0c8(pc),a2
  206. initloop2:
  207.     move.l a1,10(a0)
  208.     move.l a1,18(a0)
  209.     clr.l 14(a0)
  210.     clr.b 45(a0)
  211.     clr.b 47(a0)
  212.     clr.w 8(a0)
  213.     clr.l 48(a0)
  214.     move.b #$01,23(a0)
  215.     move.b #$01,24(a0)
  216.     clr.b 25(a0)
  217.     clr.l 26(a0)
  218.     clr.w 30(a0)
  219.     moveq #$00,d3
  220.     move.w (a2)+,d1
  221.     move.w (a2)+,d3
  222.     divu #$0003,d3
  223.     move.b d3,32(a0)
  224.     mulu #$0003,d3
  225.     andi.l #$00ff,d3
  226.     andi.l #$00ff,d1
  227.     addi.l #$dff0a0,d1
  228.     move.l d1,a6
  229.     move.l #$0000,(a6)
  230.     move.w #$0100,4(a6)
  231.     move.w #$0000,6(a6)
  232.     move.w #$0000,8(a6)
  233.     move.l d1,60(a0)
  234.     clr.w 64(a0)
  235.     move.l SEQpoint(pc),(a0)
  236.     move.l SEQpoint(pc),52(a0)
  237.     add.l d0,52(a0)
  238.     add.l d3,52(a0)
  239.     add.l d7,(a0)
  240.     add.l d3,(a0)
  241.     move.w #$000d,6(a0)
  242.     move.l (a0),a3
  243.     move.b (a3),d1
  244.     andi.l #$00ff,d1
  245.     lsl.w #6,d1
  246.     move.l PATpoint(pc),a4
  247.     adda.w d1,a4
  248.     move.l a4,34(a0)
  249.     clr.l 38(a0)
  250.     move.b #$01,33(a0)
  251.     move.b #$02,42(a0)
  252.     move.b 1(a3),44(a0)
  253.     move.b 2(a3),22(a0)
  254.     clr.b 43(a0)
  255.     clr.b 45(a0)
  256.     clr.w 56(a0)
  257.     adda.w #$004a,a0    ;Point to next voice's data area
  258.     dbf d6,initloop2
  259.     rts
  260.  
  261.  
  262. PLAY:
  263.     lea pervol(pc),a6
  264.     tst.w onoff
  265.     bne.s music_on
  266.     rts
  267. music_on:
  268.     subq.w #1,respcnt        ;Decrease replayspeed counter
  269.     bne.s nonewnote
  270.     move.w repspd(pc),respcnt    ;Restore replayspeed counter
  271.     lea V1data(pc),a0        ;Point to voice1 data area
  272.     bsr new_note
  273.     lea V2data(pc),a0        ;Point to voice2 data area
  274.     bsr new_note
  275.     lea V3data(pc),a0        ;Point to voice3 data area
  276.     bsr new_note
  277.     lea V4data(pc),a0        ;Point to voice4 data area
  278.     bsr new_note
  279. nonewnote:
  280.     clr.w audtemp
  281.     lea V1data(pc),a0
  282.     bsr effects
  283.     move.w d0,(a6)+
  284.     move.w d1,(a6)+
  285.     lea V2data(pc),a0
  286.     bsr effects
  287.     move.w d0,(a6)+
  288.     move.w d1,(a6)+
  289.     lea V3data(pc),a0
  290.     bsr effects
  291.     move.w d0,(a6)+
  292.     move.w d1,(a6)+
  293.     lea V4data(pc),a0
  294.     bsr effects
  295.     move.w d0,(a6)+
  296.     move.w d1,(a6)+
  297.     lea pervol(pc),a6
  298.     move.w audtemp(pc),d0
  299.     ori.w #$8000,d0            ;Set/clr bit = 1
  300.     move.w d0,-(a7)
  301.     moveq #0,d1
  302.     move.l start1(pc),d2        ;Get samplepointers
  303.     move.w offset1(pc),d1        ;Get offset
  304.     add.l d1,d2            ;Add offset
  305.     move.l start2(pc),d3
  306.     move.w offset2(pc),d1
  307.     add.l d1,d3
  308.     move.l start3(pc),d4
  309.     move.w offset3(pc),d1
  310.     add.l d1,d4
  311.     move.l start4(pc),d5
  312.     move.w offset4(pc),d1
  313.     add.l d1,d5
  314.     move.w ssize1(pc),d0        ;Get sound lengths
  315.     move.w ssize2(pc),d1
  316.     move.w ssize3(pc),d6
  317.     move.w ssize4(pc),d7
  318.     move.w (a7)+,$dff096        ;Enable audio DMA
  319. chan1:
  320.     lea V1data(pc),a0
  321.     tst.w 72(a0)
  322.     beq.s chan2
  323.     subq.w #1,72(a0)
  324.     cmpi.w #1,72(a0)
  325.     bne.s chan2
  326.     clr.w 72(a0)
  327.     move.l d2,$dff0a0        ;Set soundstart
  328.     move.w d0,$dff0a4        ;Set soundlength
  329. chan2:
  330.     lea V2data(pc),a0
  331.     tst.w 72(a0)
  332.     beq.s chan3
  333.     subq.w #1,72(a0)
  334.     cmpi.w #1,72(a0)
  335.     bne.s chan3
  336.     clr.w 72(a0)
  337.     move.l d3,$dff0b0
  338.     move.w d1,$dff0b4
  339. chan3:
  340.     lea V3data(pc),a0
  341.     tst.w 72(a0)
  342.     beq.s chan4
  343.     subq.w #1,72(a0)
  344.     cmpi.w #1,72(a0)
  345.     bne.s chan4
  346.     clr.w 72(a0)
  347.     move.l d4,$dff0c0
  348.     move.w d6,$dff0c4
  349. chan4:
  350.     lea V4data(pc),a0
  351.     tst.w 72(a0)
  352.     beq.s setpervol
  353.     subq.w #1,72(a0)
  354.     cmpi.w #1,72(a0)
  355.     bne.s setpervol
  356.     clr.w 72(a0)
  357.     move.l d5,$dff0d0
  358.     move.w d7,$dff0d4
  359. setpervol:
  360.     lea $dff0a6,a5
  361.     move.w (a6)+,(a5)    ;Set period
  362.     move.w (a6)+,d0        ; added
  363.     mulu fc_SndLVol,d0    ; by
  364.     lsr.w #6,d0        ; Delirium
  365.     move.w d0,2(a5)        ;Set volume
  366.  
  367.     move.w (a6)+,16(a5)    ;Set period
  368.     move.w (a6)+,d0        ; added
  369.     mulu fc_SndRVol,d0    ; by
  370.     lsr.w #6,d0        ; Delirium
  371.     move.w d0,18(a5)    ;Set volume
  372.  
  373.     move.w (a6)+,32(a5)    ;Set period
  374.     move.w (a6)+,d0        ; added
  375.     mulu fc_SndRVol,d0    ; by
  376.     lsr.w #6,d0        ; Delirium
  377.     move.w d0,34(a5)    ;Set volume
  378.  
  379.     move.w (a6)+,48(a5)    ;Set period
  380.     move.w (a6)+,d0        ; added
  381.     mulu fc_SndLVol,d0    ; by
  382.     lsr.w #6,d0        ; Delirium
  383.     move.w d0,50(a5)    ;Set volume
  384.     rts
  385.  
  386. new_note:
  387.     moveq #0,d5
  388.     move.l 34(a0),a1
  389.     adda.w 40(a0),a1
  390.     cmp.w #64,40(a0)
  391.     bne samepat
  392.     move.l (a0),a2
  393.     adda.w 6(a0),a2        ;Point to next sequence row
  394.     cmpa.l 52(a0),a2    ;Is it the end?
  395.     bne.s notend
  396.     move.l    fc_songend,a2
  397.     jsr    (a2)        ; signal songend to DeliTracker
  398.     move.w d5,6(a0)        ;yes!
  399.     move.l (a0),a2        ;Point to first sequence
  400. notend:
  401.     moveq #1,d1
  402.     addq.b #1,spdtemp
  403.     cmpi.b #5,spdtemp
  404.     bne.s nonewspd
  405.     move.b d1,spdtemp
  406.     move.b 12(a2),d1    ;Get new replay speed
  407.     beq.s nonewspd
  408.     move.w d1,respcnt    ;store in counter
  409.     move.w d1,repspd
  410. nonewspd:
  411.     move.b (a2),d1        ;Pattern to play
  412.     move.b 1(a2),44(a0)    ;Transpose value
  413.     move.b 2(a2),22(a0)    ;Soundtranspose value
  414.  
  415.     move.w d5,40(a0)
  416.     lsl.w #6,d1
  417.     add.l PATpoint(pc),d1    ;Get pattern pointer
  418.     move.l d1,34(a0)
  419.     addi.w #$000d,6(a0)
  420.     move.l d1,a1
  421. samepat:
  422.     move.b 1(a1),d1        ;Get info byte
  423.     move.b (a1)+,d0        ;Get note
  424.     bne.s ww1
  425.     andi.w #%11000000,d1
  426.     beq.s noport
  427.     bra.s ww11
  428. ww1:
  429.     move.w d5,56(a0)
  430. ww11:
  431.     move.b d5,47(a0)
  432.     move.b (a1),31(a0)
  433.  
  434.         ;31(a0) = PORTAMENTO/INSTR. info
  435.             ;Bit 7 = portamento on
  436.             ;Bit 6 = portamento off
  437.             ;Bit 5-0 = instrument number
  438.         ;47(a0) = portamento value
  439.             ;Bit 7-5 = always zero
  440.             ;Bit 4 = up/down
  441.             ;Bit 3-0 = value
  442. t_porton:
  443.     btst #7,d1
  444.     beq.s noport
  445.     move.b 2(a1),47(a0)    
  446. noport:
  447.     andi.w #$007f,d0
  448.     beq nextnote
  449.     move.b d0,8(a0)
  450.     move.b (a1),9(a0)
  451.     move.b 32(a0),d2
  452.     moveq #0,d3
  453.     bset d2,d3
  454.     or.w d3,audtemp
  455.     move.w d3,$dff096
  456.     move.b (a1),d1
  457.     andi.w #$003f,d1    ;Max 64 instruments
  458.     add.b 22(a0),d1
  459.     move.l VOLpoint(pc),a2
  460.     lsl.w #6,d1
  461.     adda.w d1,a2
  462.     move.w d5,16(a0)
  463.     move.b (a2),23(a0)
  464.     move.b (a2)+,24(a0)
  465.     move.b (a2)+,d1
  466.     andi.w #$00ff,d1
  467.     move.b (a2)+,27(a0)
  468.     move.b #$40,46(a0)
  469.     move.b (a2)+,d0
  470.     move.b d0,28(a0)
  471.     move.b d0,29(a0)
  472.     move.b (a2)+,30(a0)
  473.     move.l a2,10(a0)
  474.     move.l FRQpoint(pc),a2
  475.     lsl.w #6,d1
  476.     adda.w d1,a2
  477.     move.l a2,18(a0)
  478.     move.w d5,50(a0)
  479.     move.b d5,26(a0)
  480.     move.b d5,25(a0)
  481. nextnote:
  482.     addq.w #2,40(a0)
  483.     rts
  484.  
  485. effects:
  486.     moveq #0,d7
  487. testsustain:
  488.     tst.b 26(a0)        ;Is sustain counter = 0
  489.     beq.s sustzero
  490.     subq.b #1,26(a0)    ;if no, decrease counter
  491.     bra VOLUfx
  492. sustzero:        ;Next part of effect sequence
  493.     move.l 18(a0),a1    ;can be executed now.
  494.     adda.w 50(a0),a1
  495. testeffects:
  496.     cmpi.b #$e1,(a1)    ;E1 = end of FREQseq sequence
  497.     beq VOLUfx
  498.     cmpi.b #$e0,(a1)    ;E0 = loop to other part of sequence
  499.     bne.s testnewsound
  500.     move.b 1(a1),d0        ;loop to start of sequence + 1(a1)
  501.     andi.w #$003f,d0
  502.     move.w d0,50(a0)
  503.     move.l 18(a0),a1
  504.     adda.w d0,a1
  505. testnewsound:
  506.     cmpi.b #$e2,(a1)    ;E2 = set waveform
  507.     bne.s o49c64
  508.     moveq #0,d0
  509.     moveq #0,d1
  510.     move.b 32(a0),d1
  511.     bset d1,d0
  512.     or.w d0,audtemp
  513.     move.w d0,$dff096
  514.     move.b 1(a1),d0
  515.     andi.w #$00ff,d0
  516.     lea SOUNDINFO(pc),a4
  517.     add.w d0,d0
  518.     move.w d0,d1
  519.     add.w d1,d1
  520.     add.w d1,d1
  521.     add.w d1,d0
  522.     adda.w d0,a4
  523.     move.l 60(a0),a3
  524.     move.l (a4),d1
  525.     add.l #WAVEFORMS,d1
  526.     move.l d1,(a3)
  527.     move.l d1,68(a0)
  528.     move.w 4(a4),4(a3)
  529.     move.l 6(a4),64(a0)
  530.     swap d1
  531.     move.w #$0003,72(a0)
  532.     tst.w d1
  533.     bne.s o49c52
  534.     move.w #$0002,72(a0)
  535. o49c52:
  536.     clr.w 16(a0)
  537.     move.b #$01,23(a0)
  538.     addq.w #2,50(a0)
  539.     bra o49d02
  540. o49c64:
  541.     cmpi.b #$e4,(a1)
  542.     bne.s testpatjmp
  543.     move.b 1(a1),d0
  544.     andi.w #$00ff,d0
  545.     lea SOUNDINFO(pc),a4
  546.     add.w d0,d0
  547.     move.w d0,d1
  548.     add.w d1,d1
  549.     add.w d1,d1
  550.     add.w d1,d0
  551.     adda.w d0,a4
  552.     move.l 60(a0),a3
  553.     move.l (a4),d1
  554.     add.l #WAVEFORMS,d1
  555.     move.l d1,(a3)
  556.     move.l d1,68(a0)
  557.     move.w 4(a4),4(a3)
  558.     move.l 6(a4),64(a0)
  559.  
  560.     swap d1
  561.     move.w #$0003,72(a0)
  562.     tst.w d1
  563.     bne.s o49cae
  564.     move.w #$0002,72(a0)
  565. o49cae:
  566.     addq.w #2,50(a0)
  567.     bra.s o49d02
  568. testpatjmp:
  569.     cmpi.b #$e7,(a1)
  570.     bne.s testnewsustain
  571.     move.b 1(a1),d0
  572.     andi.w #$00ff,d0
  573.     lsl.w #6,d0
  574.     move.l FRQpoint(pc),a1
  575.     adda.w d0,a1
  576.     move.l a1,18(a0)
  577.     move.w d7,50(a0)
  578.     bra testeffects
  579. testnewsustain:
  580.     cmpi.b #$e8,(a1)    ;E8 = set sustain time
  581.     bne.s o49cea
  582.     move.b 1(a1),26(a0)
  583.     addq.w #2,50(a0)
  584.     bra testsustain
  585. o49cea:
  586.     cmpi.b #$e3,(a1)
  587.     bne.s o49d02
  588.     addq.w #3,50(a0)
  589.     move.b 1(a1),27(a0)
  590.     move.b 2(a1),28(a0)
  591. o49d02:
  592.     move.l 18(a0),a1
  593.     adda.w 50(a0),a1
  594.     move.b (a1),43(a0)
  595.     addq.w #1,50(a0)
  596. VOLUfx:
  597.     tst.b 25(a0)
  598.     beq.s o49d1e
  599.     subq.b #1,25(a0)
  600.     bra.s o49d70
  601. o49d1e:
  602.     subq.b #1,23(a0)
  603.     bne.s o49d70
  604.     move.b 24(a0),23(a0)
  605. o49d2a:
  606.     move.l 10(a0),a1
  607.     adda.w 16(a0),a1
  608.     move.b (a1),d0
  609.     cmpi.b #$e8,d0
  610.     bne.s o49d4a
  611.     addq.w #2,16(a0)
  612.     move.b 1(a1),25(a0)
  613.     bra.s VOLUfx
  614. o49d4a:
  615.     cmpi.b #$e1,d0
  616.     beq.s o49d70
  617.     cmpi.b #$e0,d0
  618.     bne.s o49d68
  619.     move.b 1(a1),d0
  620.     andi.l #$003f,d0
  621.     subq.b #5,d0
  622.     move.w d0,16(a0)
  623.     bra.s o49d2a
  624. o49d68:
  625.     move.b (a1),45(a0)
  626.     addq.w #1,16(a0)
  627. o49d70:
  628.     move.b 43(a0),d0
  629.     bmi.s o49d7e
  630.     add.b 8(a0),d0
  631.     add.b 44(a0),d0
  632. o49d7e:
  633.     andi.w #$007f,d0
  634.     lea PERIODS(pc),a1
  635.     add.w d0,d0
  636.     move.w d0,d1
  637.     adda.w d0,a1
  638.     move.w (a1),d0
  639.     move.b 46(a0),d7
  640.     tst.b 30(a0)
  641.     beq.s o49d9e
  642.     subq.b #1,30(a0)
  643.  
  644.     bra.s o49df4
  645. o49d9e:
  646.     move.b d1,d5
  647.     move.b 28(a0),d4
  648.     add.b d4,d4
  649.     move.b 29(a0),d1
  650.     tst.b d7
  651.     bpl.s o49db4
  652.     btst #0,d7
  653.     bne.s o49dda
  654. o49db4:
  655.     btst #5,d7
  656.     bne.s o49dc8
  657.     sub.b 27(a0),d1
  658.     bcc.s o49dd6
  659.     bset #5,d7
  660.     moveq #0,d1
  661.     bra.s o49dd6
  662. o49dc8:
  663.     add.b 27(a0),d1
  664.     cmp.b d4,d1
  665.     bcs.s o49dd6
  666.     bclr #5,d7
  667.     move.b d4,d1
  668. o49dd6:
  669.     move.b d1,29(a0)
  670. o49dda:
  671.     lsr.b #1,d4
  672.     sub.b d4,d1
  673.     bcc.s o49de4
  674.     subi.w #$0100,d1
  675. o49de4:
  676.     addi.b #$a0,d5
  677.     bcs.s o49df2
  678. o49dea:
  679.     add.w d1,d1
  680.     addi.b #$18,d5
  681.     bcc.s o49dea
  682. o49df2:
  683.     add.w d1,d0
  684. o49df4:
  685.     eori.b #$01,d7
  686.     move.b d7,46(a0)
  687.  
  688.     ; DO THE PORTAMENTO THING
  689.     moveq #0,d1
  690.     move.b 47(a0),d1    ;get portavalue
  691.     beq.s a56d0        ;0=no portamento
  692.     cmpi.b #$1f,d1
  693.     bls.s portaup
  694. portadown: 
  695.     andi.w #$1f,d1
  696.     neg.w d1
  697. portaup:
  698.     sub.w d1,56(a0)
  699. a56d0:
  700.     add.w 56(a0),d0
  701. o49e3e:
  702.     cmpi.w #$0070,d0
  703.     bhi.s nn1
  704.     move.w #$0071,d0
  705. nn1:
  706.     cmpi.w #$06b0,d0
  707.     bls.s nn2
  708.     move.w #$06b0,d0
  709. nn2:
  710.     moveq #0,d1
  711.     move.b 45(a0),d1
  712.     rts
  713.  
  714.  
  715.  
  716. pervol: dcb.b 16,0    ;Periods & Volumes temp. store
  717. respcnt: dc.w 0        ;Replay speed counter 
  718. repspd:  dc.w 0        ;Replay speed counter temp
  719. onoff:   dc.w 0        ;Music on/off flag.
  720. firseq:     dc.w 0        ;First sequence
  721. lasseq:     dc.w 0        ;Last sequence
  722. audtemp: dc.w 0
  723. spdtemp: dc.w 0
  724.  
  725. V1data:  dcb.b 64,0    ;Voice 1 data area
  726. offset1: dcb.b 02,0    ;Is added to start of sound
  727. ssize1:  dcb.b 02,0    ;Length of sound
  728. start1:  dcb.b 06,0    ;Start of sound
  729.  
  730. V2data:  dcb.b 64,0    ;Voice 2 data area
  731. offset2: dcb.b 02,0
  732. ssize2:  dcb.b 02,0
  733. start2:  dcb.b 06,0
  734.  
  735. V3data:  dcb.b 64,0    ;Voice 3 data area
  736. offset3: dcb.b 02,0
  737. ssize3:  dcb.b 02,0
  738. start3:  dcb.b 06,0
  739.  
  740. V4data:  dcb.b 64,0    ;Voice 4 data area
  741. offset4: dcb.b 02,0
  742. ssize4:  dcb.b 02,0
  743. start4:  dcb.b 06,0
  744.  
  745. o4a0c8: dc.l $00000000,$00100003,$00200006,$00300009
  746. SEQpoint: dc.l 0
  747. PATpoint: dc.l 0
  748. FRQpoint: dc.l 0
  749. VOLpoint: dc.l 0
  750.  
  751.  
  752.     even
  753. SILENT: dc.w $0100,$0000,$0000,$00e1
  754.  
  755. PERIODS:dc.w $06b0,$0650,$05f4,$05a0,$054c,$0500,$04b8,$0474
  756.     dc.w $0434,$03f8,$03c0,$038a,$0358,$0328,$02fa,$02d0
  757.     dc.w $02a6,$0280,$025c,$023a,$021a,$01fc,$01e0,$01c5
  758.     dc.w $01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d
  759.     dc.w $010d,$00fe,$00f0,$00e2,$00d6,$00ca,$00be,$00b4
  760.     dc.w $00aa,$00a0,$0097,$008f,$0087,$007f,$0078,$0071
  761.     dc.w $0071,$0071,$0071,$0071,$0071,$0071,$0071,$0071
  762.     dc.w $0071,$0071,$0071,$0071,$0d60,$0ca0,$0be8,$0b40
  763.     dc.w $0a98,$0a00,$0970,$08e8,$0868,$07f0,$0780,$0714
  764.     dc.w $1ac0,$1940,$17d0,$1680,$1530,$1400,$12e0,$11d0
  765.     dc.w $10d0,$0fe0,$0f00,$0e28
  766.  
  767. SOUNDINFO:
  768. ;Offset.l , Sound-length.w , Start-offset.w , Repeat-length.w 
  769.  
  770. ;Reserved for samples
  771.     dc.w $0000,$0000,$0000,$0000,$0001 
  772.     dc.w $0000,$0000,$0000,$0000,$0001 
  773.     dc.w $0000,$0000,$0000,$0000,$0001 
  774.     dc.w $0000,$0000,$0000,$0000,$0001 
  775.     dc.w $0000,$0000,$0000,$0000,$0001 
  776.     dc.w $0000,$0000,$0000,$0000,$0001 
  777.     dc.w $0000,$0000,$0000,$0000,$0001 
  778.     dc.w $0000,$0000,$0000,$0000,$0001 
  779.     dc.w $0000,$0000,$0000,$0000,$0001 
  780.     dc.w $0000,$0000,$0000,$0000,$0001 
  781. ;Reserved for synth sounds
  782.     dc.w $0000,$0000,$0010,$0000,$0010 
  783.     dc.w $0000,$0020,$0010,$0000,$0010 
  784.     dc.w $0000,$0040,$0010,$0000,$0010 
  785.     dc.w $0000,$0060,$0010,$0000,$0010 
  786.     dc.w $0000,$0080,$0010,$0000,$0010 
  787.     dc.w $0000,$00a0,$0010,$0000,$0010 
  788.     dc.w $0000,$00c0,$0010,$0000,$0010 
  789.     dc.w $0000,$00e0,$0010,$0000,$0010 
  790.     dc.w $0000,$0100,$0010,$0000,$0010 
  791.     dc.w $0000,$0120,$0010,$0000,$0010 
  792.     dc.w $0000,$0140,$0010,$0000,$0010 
  793.     dc.w $0000,$0160,$0010,$0000,$0010 
  794.     dc.w $0000,$0180,$0010,$0000,$0010 
  795.     dc.w $0000,$01a0,$0010,$0000,$0010 
  796.     dc.w $0000,$01c0,$0010,$0000,$0010 
  797.     dc.w $0000,$01e0,$0010,$0000,$0010 
  798.     dc.w $0000,$0200,$0010,$0000,$0010 
  799.     dc.w $0000,$0220,$0010,$0000,$0010 
  800.     dc.w $0000,$0240,$0010,$0000,$0010 
  801.     dc.w $0000,$0260,$0010,$0000,$0010 
  802.     dc.w $0000,$0280,$0010,$0000,$0010 
  803.     dc.w $0000,$02a0,$0010,$0000,$0010 
  804.     dc.w $0000,$02c0,$0010,$0000,$0010 
  805.     dc.w $0000,$02e0,$0010,$0000,$0010 
  806.     dc.w $0000,$0300,$0010,$0000,$0010 
  807.     dc.w $0000,$0320,$0010,$0000,$0010 
  808.     dc.w $0000,$0340,$0010,$0000,$0010 
  809.     dc.w $0000,$0360,$0010,$0000,$0010 
  810.     dc.w $0000,$0380,$0010,$0000,$0010 
  811.     dc.w $0000,$03a0,$0010,$0000,$0010 
  812.     dc.w $0000,$03c0,$0010,$0000,$0010 
  813.     dc.w $0000,$03e0,$0010,$0000,$0010 
  814.     dc.w $0000,$0400,$0008,$0000,$0008 
  815.     dc.w $0000,$0410,$0008,$0000,$0008 
  816.     dc.w $0000,$0420,$0008,$0000,$0008 
  817.     dc.w $0000,$0430,$0008,$0000,$0008 
  818.     dc.w $0000,$0440,$0008,$0000,$0008
  819.     dc.w $0000,$0450,$0008,$0000,$0008
  820.     dc.w $0000,$0460,$0008,$0000,$0008
  821.     dc.w $0000,$0470,$0008,$0000,$0008
  822.     dc.w $0000,$0480,$0010,$0000,$0010
  823.     dc.w $0000,$04a0,$0008,$0000,$0008
  824.     dc.w $0000,$04b0,$0010,$0000,$0010
  825.     dc.w $0000,$04d0,$0010,$0000,$0010
  826.     dc.w $0000,$04f0,$0008,$0000,$0008
  827.     dc.w $0000,$0500,$0008,$0000,$0008
  828.     dc.w $0000,$0510,$0018,$0000,$0018
  829.  
  830.  
  831. WAVEFORMS:
  832.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  833.     dc.w $3f37,$2f27,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  834.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  835.     dc.w $c037,$2f27,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  836.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  837.     dc.w $c0b8,$2f27,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  838.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  839.     dc.w $c0b8,$b027,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  840.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  841.     dc.w $c0b8,$b0a8,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  842.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  843.     dc.w $c0b8,$b0a8,$a017,$0f07,$ff07,$0f17,$1f27,$2f37
  844.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  845.     dc.w $c0b8,$b0a8,$a098,$0f07,$ff07,$0f17,$1f27,$2f37
  846.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  847.     dc.w $c0b8,$b0a8,$a098,$9007,$ff07,$0f17,$1f27,$2f37
  848.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  849.     dc.w $c0b8,$b0a8,$a098,$9088,$ff07,$0f17,$1f27,$2f37
  850.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  851.     dc.w $c0b8,$b0a8,$a098,$9088,$8007,$0f17,$1f27,$2f37
  852.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  853.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$0f17,$1f27,$2f37
  854.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  855.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9017,$1f27,$2f37
  856.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  857.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$1f27,$2f37
  858.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  859.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$a027,$2f37
  860.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  861.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$a0a8,$2f37
  862.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  863.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$a0a8,$b037
  864.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  865.     dc.w $7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  866.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  867.     dc.w $817f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  868.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  869.     dc.w $8181,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  870.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  871.     dc.w $8181,$817f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  872.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  873.     dc.w $8181,$8181,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  874.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  875.     dc.w $8181,$8181,$817f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  876.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  877.     dc.w $8181,$8181,$8181,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  878.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  879.     dc.w $8181,$8181,$8181,$817f,$7f7f,$7f7f,$7f7f,$7f7f
  880.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  881.     dc.w $8181,$8181,$8181,$8181,$7f7f,$7f7f,$7f7f,$7f7f
  882.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  883.     dc.w $8181,$8181,$8181,$8181,$817f,$7f7f,$7f7f,$7f7f
  884.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  885.     dc.w $8181,$8181,$8181,$8181,$8181,$7f7f,$7f7f,$7f7f
  886.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  887.     dc.w $8181,$8181,$8181,$8181,$8181,$817f,$7f7f,$7f7f
  888.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  889.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$7f7f,$7f7f
  890.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  891.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$817f,$7f7f
  892.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$8080
  893.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$7f7f
  894.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$8080
  895.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$807f
  896.     dc.w $8080,$8080,$8080,$8080,$7f7f,$7f7f,$7f7f,$7f7f
  897.     dc.w $8080,$8080,$8080,$807f,$7f7f,$7f7f,$7f7f,$7f7f
  898.     dc.w $8080,$8080,$8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  899.     dc.w $8080,$8080,$807f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  900.     dc.w $8080,$8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  901.     dc.w $8080,$807f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  902.     dc.w $8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  903.     dc.w $8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  904.     dc.w $8080,$9098,$a0a8,$b0b8,$c0c8,$d0d8,$e0e8,$f0f8
  905.     dc.w $0008,$1018,$2028,$3038,$4048,$5058,$6068,$707f
  906.     dc.w $8080,$a0b0,$c0d0,$e0f0,$0010,$2030,$4050,$6070
  907.     dc.w $4545,$797d,$7a77,$7066,$6158,$534d,$2c20,$1812
  908.     dc.w $04db,$d3cd,$c6bc,$b5ae,$a8a3,$9d99,$938e,$8b8a
  909.     dc.w $4545,$797d,$7a77,$7066,$5b4b,$4337,$2c20,$1812
  910.     dc.w $04f8,$e8db,$cfc6,$beb0,$a8a4,$9e9a,$9594,$8d83
  911.     dc.w $0000,$4060,$7f60,$4020,$00e0,$c0a0,$80a0,$c0e0
  912.     dc.w $0000,$4060,$7f60,$4020,$00e0,$c0a0,$80a0,$c0e0
  913.     dc.w $8080,$9098,$a0a8,$b0b8,$c0c8,$d0d8,$e0e8,$f0f8
  914.     dc.w $0008,$1018,$2028,$3038,$4048,$5058,$6068,$707f
  915.     dc.w $8080,$a0b0,$c0d0,$e0f0,$0010,$2030,$4050,$6070
  916.  
  917.